#ifndef QCONFIGFILE_BASE_H
#define QCONFIGFILE_BASE_H

#include <QFile>
#include <QtXml/QDomDocument>
//-----------------------------------------------------------------------------
/** @class QConfigFile
    \brief Класс для работы с XML файлом конфигурации.

    Пример работы с классом:
        <pre>
        QConfigFile *cf_1 = new QConfigFile(".any_prog", "main_win");
        cf_1.ReadFile();

        QDateTime dt_1=QDateTime::currentDateTime();
        cf_1.SetParam("CurrentDate", dt_1);
        cf_1.WriteFile();

        delete cf_1;

        ...

        QVariant  v2;
        QDateTime dt_2;

        QConfigFile *cf_2 = new QConfigFile(".any_prog", "main_win");
        cf_2.ReadFile();
        cf_2.GetParam("CurrentDate", v2);

        dt_2 = v1.toDateTime();

        qDebug()<< "Дата:" << dt_2;
        delete cf_2;
        </pre>
  */
//-----------------------------------------------------------------------------
class QConfigFile : public QDomDocument
{
protected:
    bool         IsReady; ///< \brief true - если все готово к работе
    QString      ModuleName; ///< \brief Имя модуля (задается в конструкторе)
    QString      FullDirName;  ///< \brief Полное имя каталога с конфиг. файлом
    QString      FullFileName; ///< \brief Полное имя конфиг.файла с путем


    bool CheckFile(QString full_file_name);
    bool CheckDir(QString full_dir_name);
    bool CreateNewFile(QString full_file_name);

    QDomElement GetRoot(const QString& root_name);

    QString getAttribS(QDomElement root_el,
                      const QString& elem_name, const QString& attr_name,
                      const QString& def_val);
    QString setAttribS(QDomElement root_el, const QString& elem_name, const QString& attr_name, QString attr_val);


public:
    /** \brief Конструктор
        \param subdir_name - имя подкаталога в каталоге \%HOME\%
        \param module_name - имя данного модуля,
            будет использовано в качестве имени конфигурационного файла

        В результате будет создан (если его еще нет) файл:
        QDir::homePath() + subdir_name + module_name +".cfg"
      */
    QConfigFile(QString subdir_name, QString module_name);

    /// \brief Деструктор
    virtual ~QConfigFile();

    /** \brief Возвращает true, если все готово к работе
        \return true - если удалось создать/открыть заданный файл конфигурации
      */
    bool isReady(){return IsReady;};

    /** \brief Прочитать содержимое файла с диска
        \return true - если успешно
      */
    virtual bool ReadFile();

    /** \brief Записать содержимое файла на диск
        \return true - если успешно
      */
    virtual bool WriteFile();

    /** \brief Задать значение параметра
        \param param_name - имя параметра
        \param param_val - значение параметра
        \return true - если успешно

        Если нужно изменить содержание файла, который уже есть на диске,
        его необходимо предварительно считать командой QConfigFile::ReadFile().
        А после изменения нужных параметров - сохранить командой QConfigFile::WriteFile().
      */
    bool SetParam(const QString& param_name, QVariant  param_val);

    /** \brief Получить значение параметра
        \param param_name - имя параметра
        \param param_val - значение параметра
        \return true - если успешно

        Файл необходимо предварительно считать командой QConfigFile::ReadFile().
      */
    bool GetParam(const QString& param_name, QVariant &param_val);
};

#endif // QCONFIGFILE_BASE_H
